;-------------------------------------------------------------------------------
; Copyright 1995-1996 KEIL Software, Inc.
; 8051 Processor Declarations
;-------------------------------------------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 备注：	1、从Keil安装文件夹的Keil_v5\C51\ASM\REG51.INC拷贝而来；
;			2、8051 CPU内核的寄存器含义的介绍可参考大学的单片机原理等课程，也可以看
;			STC官方文档《STC89C52系列单片机器件手册》;只想看原版8051指令集文档，
;			不想看教材的话，可以搜索下载“Atmel 8051 Microcontrollers Hardware Manual”，
;			或者“MCS ® 51 Family of Microcontrollers Architectural Overview”；
;			本Git仓库doc文件夹内有上述文档的下载链接；
;			3、00H~7FH的地址是R0~R7等通用寄存器地址、位寻址地址和RAM堆栈地址；80H及
;			之后都是SFR特殊功能寄存器；
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

$SAVE	; 存储该源文件内的内容到内部栈（stack），和$RESTORE成对使用
$NOLIST	; 编译时该源文件内容不放到listing文件中

;;
; 1、有关一些80H之前地址的细节，详见《STC89C52系列单片机器件手册》的章节“3.2 数据存储器(SRAM)”
; 2、要使用本寄存器文件的话，需要在Keil的Project-->Options for Target-->Device中勾选
;	Use Extended Linker(LX51) instead of BL51和Use Extended Assembler(AX51) instead A51

; BYTE Register

;;
; DATA定义地址（寄存器名），和C语言volatile void *, int *等类似，
; 不同的芯片原厂都会把8051的寄存器名称定义成芯片文档中描述的寄存器名称，
; 类似的，C语言中对i、j、k、src、dst、ret、res等变量命名也有一些约定俗成的传统；
; 立即数以0~9开头，H结尾，所以A~F前要加0；
P0      DATA    80H		; IO输入输出的值，可直接用P0.0、P0.7等按位操作
P1      DATA    90H
P2      DATA    0A0H
P3      DATA    0B0H
PSW     DATA    0D0H	; 程序状态字，详情见后面位寻址部分
; A
ACC     DATA    0E0H	; 累加器，调用时可以用名字ACC，可以用名字A，写程序时常用作一个变量
B       DATA    0F0H
SP      DATA    81H		; 堆栈指针，复位时默认指向07H，也就是通用寄存器组0的R7寄存器
; DPTR
DPL     DATA    82H		; 数据指针，还有个合在一起的名字DPTR，操作16位地址的数据
DPH     DATA    83H
PCON    DATA    87H		; 电源控制及串口的一些设置，详情见后面注释
TCON    DATA    88H		; 定时器控制寄存器，详情见位寻址部分
TMOD    DATA    89H		; 定时器工作模式寄存器，详情见后面注释
TL0     DATA    8AH		; TH1/0 TL1/0位定时器1的16位计数值+分频值
TL1     DATA    8BH
TH0     DATA    8CH
TH1     DATA    8DH
IE      DATA    0A8H	; 中断允许寄存器，详情见位寻址部分
IP      DATA    0B8H	; 中断优先级寄存器，详情见位寻址部分
SCON    DATA    98H		; 串口控制寄存器，详情见位寻址部分
SBUF    DATA    99H		; 串口双向缓冲区，读是收到的串口数据，写是串口发送的数据
						; 串口输入输出会占用P3的IO口，P3.0是接收RX，P3.1是发送TX

; 上述以0或8结尾的寄存器都可位寻址

;;
; BIT定义位寻址寄存器，位寻址首地址和原寄存器地址一样，后面的按位加，其值会
; 和别的按字节寻址的地址值重合，但是会访问不一样的地方
; 下面也可以写成 CY BIT PSW.7，用寄存器名加上.0~7的数字

; BIT Register
; PSW
CY      BIT     0D7H	; 标志位，为1时表示有加法进位或减法借位；还有个名字是C
AC      BIT     0D6H	; 进位辅助位
F0      BIT     0D5H	; 用户标志位，用户通用
RS1     BIT     0D4H	; RS1 RS0对4组通用寄存器组（R0~R7）选择，00~11是0~3组
RS0     BIT     0D3H
OV      BIT     0D2H	; 溢出标志位
P       BIT     0D0H	; 保留位

; TCON
TF1     BIT     8FH		; 定时器1溢出标志，定时器计时满后置此位，并产生中断，响应中断后硬件清零，也可软件清零
TR1     BIT     8EH		; 定时器1是否允许计数，TMOD.7=0时，1允许0停止；TMOD.7=1时INT1中断1引脚高时，且TR1=1则允许计数，TR1=0停止计数
TF0     BIT     8DH		; 定时器0溢出标志
TR0     BIT     8CH		; 定时器0是否允许计数，定时器0运行控制位
IE1     BIT     8BH		; 外部中断1产生中断
IT1     BIT     8AH		; 0则外部中断1低电平触发，1时下降沿产生中断
IE0     BIT     89H		; 外部中断0产生中断
IT0     BIT     88H		; 0则外部中断0低电平触发，1时下降沿产生中断

; IE 
EA      BIT     0AFH	; 0屏蔽所有中断，开放所有中断（还受后面位的控制）
ES      BIT     0ACH	; 0/1屏蔽允许串口1中断
ET1     BIT     0ABH	; 0/1屏蔽允许定时器1中断
EX1     BIT     0AAH	; 0/1屏蔽允许外部中断1
ET0     BIT     0A9H	; 0/1屏蔽允许定时器0中断
EX0     BIT     0A8H	; 0/1屏蔽允许外部中断0

; IP 
PS      BIT     0BCH	; 串口中断优先级，0低1高
PT1     BIT     0BBH	; 定时器1中断优先级
PX1     BIT     0BAH	; 外部中断1中断优先级
PT0     BIT     0B9H	; 定时器0中断优先级
PX0     BIT     0B8H	; 外部中断0中断优先级

; P3
RD      BIT     0B7H
WR      BIT     0B6H
T1      BIT     0B5H
T0      BIT     0B4H
INT1    BIT     0B3H
INT0    BIT     0B2H
TXD     BIT     0B1H	; 串口发送引脚
RXD     BIT     0B0H	; 串口接收引脚

; SCON
SM0     BIT     9FH		; 可用于串口帧错误检测，也可和SM1一起配置串口波特率
SM1     BIT     9EH		; SM0 SM1的值为00：串口波特率固定是SysClk/12
						;			   01：8位串口，波特率和定时器1有关
						;			   10：9位串口，波特率是SysClk/64或SysClk/32
						;			   11：9位串口，波特率和定时器1有关
SM2     BIT     9DH		; 多机通信控制有关
REN     BIT     9CH		; 1：运行串口接收，0：禁止串口接收
TB8     BIT     9BH		; 可用作发送的第9位串口数据，也可用于数据校验，也可用于多机通信
RB8     BIT     9AH		; 可用作接收的第9位串口数据，也可用作接收的停止位
TI      BIT     99H		; 串口发送完一个字节的中断
RI      BIT     98H		; 串口接收完一个字节的中断，串口收发共用一条中断，所以中断处理中要区分读写和清零

;;
; TMOD
; bit7~0: 定时器1的GATE1 C/T1 M11 M01，定时器0的GATE0 C/T0 M10 M00
; GATE1为0时定时器1始终开启，不受TCON寄存器的TR1位控制，
; GATE1为1时只有外部中断1引脚为高，且TCON寄存器的TR1位为1时才使能定时器1
; C/T1为0时从晶振计数的定时器，为1时从T1引脚输入的计数器
; M11M01的值00：13位定时器，TH1 TL1寄存器的低5位作为分频使用
;		  01：TH1 TL1寄存器都用的16位定时器
;		  10：TH1值自动装载到TL1的8位定时器
;		  11：定时器1无效，用给定时器0扩展
; 定时器0的寄存器含义同上，但有个例外如下
; M01M00的值11：定时器0作为双8位定时器

$RESTORE	; 和$SAVE成对使用
